<?php
/**
 * Created by PhpStorm.
 * User: Administrator--Reer
 * Date: 2019/7/25 0025
 * Time: 10:26
 */

namespace app\common\utils;

use app\common\exception\MyException;
use think\File;

class FileUtil extends BaseUtil
{
    static $_self = null;

    public static function getInstance()
    {
        if (empty(self::$_self)) {
            self::$_self = new FileUtil();
        }
        return self::$_self;
    }

    /** 上传文件
     * @param File $file
     * @param $path
     * @return bool|string
     * @throws \Exception
     */
    public function uploadFile(File $file, $path)
    {
        try {
            $info = $file->move($path, false);
            return '/'.$info->getPathname();
        } catch (\Exception $exception) {
            MyException::throwMyException($exception->getMessage());
        }
    }

    /** 下载文件
     * @param $fileDir
     * @param $fileName
     */
    public function downFile($fileDir, $fileName)
    {
        try {
            $file = fopen($fileDir . $fileName, "rb");//以只读和二进制模式打开文件
            Header("Content-type: application/octet-stream");//告诉浏览器这是一个文件流格式的文件
            Header("Accept-Ranges: bytes");//请求范围的度量单位
            Header("Accept-Length: " . filesize($fileDir . $fileName));//Content-Length是指定包含于请求或响应中数据的字节长度
            Header("Content-Disposition: attachment; filename=" . $fileName);//用来告诉浏览器，文件是可以当做附件被下载，下载后的文件名称为$file_name该变量的值。
            echo fread($file, filesize($fileDir . $fileName));//读取文件内容并直接输出到浏览器
            fclose($file);
        } catch (\Exception $exception) {
            echo "<script>alert('下载文件失败');history.back(-1);</script>";
        }
        exit ();
    }


    /**
     * 文件夹文件拷贝
     *
     * @param string $src 来源文件夹
     * @param string $dst 目的地文件夹
     * @return bool
     */
    public function dirCopy($src = '', $dst = '')
    {
        if (empty($src) || empty($dst)) {
            return false;
        }

        $dir = opendir($src);
        $this->dirMkdir($dst);
        while (false !== ($file = readdir($dir))) {
            if (($file != '.') && ($file != '..')) {
                if (is_dir($src . '/' . $file)) {
                    $this->dirCopy($src . '/' . $file, $dst . '/' . $file);
                } else {
                    copy($src . '/' . $file, $dst . '/' . $file);
                }
            }
        }
        closedir($dir);
        return true;
    }

    /**
     * 创建文件夹
     *
     * @param string $path 文件夹路径
     * @param int $mode 访问权限
     * @param bool $recursive 是否递归创建
     * @return bool
     */
    public function dirMkdir($path = '', $mode = 0777, $recursive = true)
    {
        clearstatcache();
        if (!is_dir($path)) {
            mkdir($path, $mode, $recursive);
            return chmod($path, $mode);
        }
        return true;
    }

    /**
     * @desc 删除指定文件夹以及文件夹下的所有文件
     * @param $dir
     * @return bool
     */
    public function delDir($dir)
    {
        if(!is_dir($dir)&&!is_file($dir))
            return;
        //先删除目录下的文件：
        $dh = opendir($dir);
        while ($file = readdir($dh)) {
            if ($file != "." && $file != "..") {
                $fullPath = $dir . "/" . $file;
                if (!is_dir($fullPath)) {
                    unlink($fullPath);
                } else {
                    $this->delDir($fullPath);
                }
            }
        }
        closedir($dh);
        //删除当前文件夹：
        if (rmdir($dir)) {
            return true;
        } else {
            return false;
        }
    }
}